package com.atguigu.gmallgate.way.filter;

import lombok.Data;
import org.checkerframework.checker.units.qual.K;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.cloud.gateway.filter.factory.AddRequestHeaderGatewayFilterFactory;
import org.springframework.cloud.gateway.filter.factory.GatewayFilterFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Arrays;
import java.util.List;

/** 局部过滤器 编写一个实现类 继承过滤器工厂 推荐顶层接口的抽象基类  配置过滤器apply(实现接口自动)
 * @author Jia Fa
 * @create 2021-12-17 16:19
 */
//@Component                                                                                        // 配置参数泛型
public class LocalGatewayFilterFactory extends AbstractGatewayFilterFactory<LocalGatewayFilterFactory.KeyValueConfig> {

    public LocalGatewayFilterFactory() {
        // 固定数量参数  需要重写父类的无参构造方法,调用super(配置类)
        super(KeyValueConfig.class);
    }
    /*局部过滤器：拦截特定路由对应服务的请求
            基本实现
			1.编写一个实现类实现GatewayFilterFactory接口，推荐继承AbstractGatewayFilterFactory基类
			2.配置过滤器
    固定数量参数：需要额外实现一下步骤
			3.需要定义一个静态内部实体类
			4.继承AbstractGatewayFilterFactory基类时，指定泛型：上一步定义的实体类
			5.重写父类的无参构造方法，调用super(step3定义的实体类)
			6.重写shortcutFieldOrder方法
    不定数量：需要额外实现以下步骤：
            7.需要在step3中的实体类中定义集合字段
			8.需要重写shortcutType方法返回ShortcutType.GATHER_LIST*/

   /* @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("key","value");
    }*/

   //不固定参数的配置  需要指定返回值类型 及 在实体类中指定集合字段
    @Override
    public ShortcutType shortcutType() {
        return ShortcutType.GATHER_LIST;
    }

    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("keys");  //自定义过滤器key=[xxx, yyy]
    }

    @Override
    public GatewayFilter apply(KeyValueConfig config) {
        // 实现GatewayFilter 接口
        return new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

//                System.out.println("自定义过滤器key="+ config.key+",value="+config.value);
                System.out.println("自定义过滤器key="+config.keys);

                return chain.filter(exchange);
            }
        };
    }
    // 静态内部类  需要将类对象设置到泛型
    @Data
    public static class KeyValueConfig{

        private List<String > keys;  // 不固定参数数量的配置

//        private String key; // 固定的参数数量
//        private String value;

    }

}
